package main

import "fmt"

//不定项参数，一定要放在最后，应该是一个切片，可以append
func mo(data1 int, data2 ...string) {
	//不定项参数能append
	data2 = append(data2, "hello")
	for k,v := range data2 {
		fmt.Println(k,v)
	}
	fmt.Println(data1, data2)
}

//闭包函数——函数返回函数
func moo() func(num int) {
	return func(num int) {
		fmt.Println("闭包函数调用", num)
	}
}

//延迟调用
func mooo() {
	fmt.Println("我想最先执行")
}

func Func(data1 int, data2 string) (ret1 int, ret2 string) {

	//这是一个内部匿名函数
	a := func(data string) {
		fmt.Println(data)
	}
	a("我是内部匿名函数")

	//自执行函数
	(func(){
		fmt.Println("我在这里执行，别人都别管我")
	})()

	//闭包函数——函数返回函数，返回的函数给个参数66666
	moo()(66666)

	//延迟调用，这是最后执行的
	defer mooo()

	//不定项函数
	ar := []string{"1", "2", "3", "4"}//切片直接传给不定项参数
	mo(2231, ar...)

	fmt.Println(data1, data2)
	//只要给ret1和ret2赋值之后，直接写return不加参数，会直接返回ret1，ret2
	return data1, data2
}
